#include "threadpool.hpp"

// 构造函数：初始化线程池，创建指定数量的工作线程
ThreadPool::ThreadPool(size_t threads) : running(true) {
    // 创建工作线程
    for(size_t i = 0; i < threads; ++i) {
        workers.emplace_back(
            [this] {
                // 工作线程一直运行
                while(true) {
                    std::function<void()> task;

                    {
                        std::unique_lock<std::mutex> lock(this->mutex);
                        // 线程池运行中且任务队列为空时阻塞等待
                        this->condition.wait(lock,[this] { return !(this->running && this->tasks.empty()); });

                        // 如果线程池已停止且任务队列为空，则退出线程
                        if(!this->running && this->tasks.empty()){
                            break;
                        }

                        task = std::move(this->tasks.front());
                        this->tasks.pop();
                    }

                    //! 注意：这里不需要加锁，避免有锁执行耗时间任务
                    task();    // 调用目标任务函数
                }
            }
        );
    }
}


ThreadPool::~ThreadPool() {
    {
        std::unique_lock<std::mutex> lock(mutex);
        running = false;
    }

    // 唤醒所有等待资源的工作线程
    condition.notify_all();

    // 等待所有工作线程完成
    for(std::thread &worker : workers){
        worker.join();
    } 
}

